package NO3_LinkedList;

/**
 * 2025-09-15
 * 力扣 - 82. 删除排序链表中的重复元素 II
 * <p>
 * 给定一个已排序的链表的头 head ， 删除原始链表中所有重复数字的节点，只留下不同的数字 。返回 已排序的链表 。
 */
public class DeleteDuplicatesMain {
    public static void main(String[] args) {
        ListNode head = new ListNode(1, new ListNode(1, new ListNode(1, new ListNode(2, new ListNode(3)))));
        ListNode.printList(head);
        System.out.println("--------------------");
        ListNode.printList(deleteDuplicates(head));
    }

    public static ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return null;
        }
        ListNode dummy = new ListNode(0, head);
        dummy.next = head;
        ListNode prev = dummy;
        ListNode curr = head;

        while (curr != null) {
            // 跳过重复的节点
            while (curr.next != null && curr.val == curr.next.val) {
                curr = curr.next;
            }

            // 检查prev.next是否等于curr
            // 如果相等，说明当前节点没有重复
            // 如果不相等，说明中间有重复节点，需要跳过
            if (prev.next == curr) {
                prev = prev.next;  // 没有重复，移动prev
            } else {
                prev.next = curr.next;  // 有重复，跳过所有重复节点
            }

            curr = curr.next;  // 移动当前指针
        }

        return dummy.next;
    }
}
